package org.halk.annotation;

import java.lang.annotation.*;

/**
 * 锁注解
 *
 * @Author halk
 * @Date 2024/9/18 16:50
 **/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lock {

    /**
     * 锁的key类型，参数或常量
     *
     * @return
     */
    KeyType keyType() default KeyType.CONSTANT;

    /**
     * 使用反射调用的参数下标，从1开始
     * @return
     */
     int paramOrder() default 1;

    /**
     * 使用反射调用的方法名
     *
     * @return
     */
    String methodName() default "";

    /**
     * 锁的key
     *
     * @return
     */
    String key() default "";

    /**
     * 锁的key前缀
     *
     * @return
     */
    String keyPrefix() default "halk:lock:";

    /**
     * 锁过期时间，毫秒
     *
     * @return
     */
    long expireTime() default 3000;

    /**
     * 获取锁失败，尝试获取锁的等待时间，毫秒
     *
     * @return
     */
    long waitTime() default 2000;

    enum KeyType {
        PARAMETER,
        CONSTANT
    }

}
